/*
 * @ClassName: HttpConn
 * @Description: 处理单个 HTTP 连接的核心类，封装网络 IO、协议解析、响应生成
 * @Note: 配合 Reactor 模式使用，每个实例对应一个客户端连接，需配合对象池复用
 */

 #ifndef HTTP_CONN_H
#define HTTP_CONN_H

#include <sys/types.h>
#include <sys/uio.h>     // readv/writev
#include <arpa/inet.h>   // sockaddr_in
#include <stdlib.h>      // atoi()
#include <errno.h>      

#include "../log/log.h"
//#include "../pool/sqlconnRAII.h"
#include "../buffer/buffer.h"
#include "httprequest.h"
#include "httpresponse.h"
class HttpConn {
    public:
        /*
         * @Function: 构造函数
         * @Description: 初始化连接状态（非阻塞、边缘触发模式等）
         * @Note: 需配合 init() 完成网络相关初始化
         */
        HttpConn();
    
        /*
         * @Function: 析构函数
         * @Description: 释放资源，关闭文件描述符
         * @Note: 触发时自动减少全局用户计数（userCount--）
         */
        ~HttpConn();
    
        /*
         * @Function: init
         * @Params: 
         *   - sockFd: 新建立的 socket 文件描述符（已完成三次握手）
         *   - addr: 客户端地址信息（用于日志记录）
         * @Description: 初始化连接上下文：
         *   1. 设置 socket 为非阻塞模式
         *   2. 初始化读写缓冲区（默认 64KB 读 + 64KB 写）
         *   3. 注册到 epoll（根据 isET 选择触发模式）
         * @Note: 需在对象池复用连接时调用 reset() 替代重建
         */
        void init(int sockFd, const sockaddr_in& addr);
    
        /*
         * @Function: read
         * @Params: saveErrno - 输出参数，保存系统调用错误码
         * @Return: 读取的字节数（-1 表示错误，0 表示对端关闭）
         * @Description: 基于 Buffer 的分散读（readv）实现：
         *   1. 优先填充读缓冲区的可写区
         *   2. 处理 ET 模式下的多次读（循环直到 EAGAIN）
         *   3. 自动扩容（默认 2 倍，最大 4MB）
         * @Note: 配合双指针缓冲区实现零拷贝解析，支持 HTTP 粘包/半包
         */
        ssize_t read(int* saveErrno);
    
        /*
         * @Function: write
         * @Params: saveErrno - 输出参数，保存系统调用错误码
         * @Return: 写入的字节数（-1 表示错误，0 表示无需写入）
         * @Description: 基于 iovec 的分散写（writev）优化：
         *   1. 优先发送响应头（iov_[0]），再发送文件数据（iov_[1]）
         *   2. 处理 ET 模式下的多次写（循环直到 EAGAIN）
         *   3. 支持大文件零拷贝（sendfile 优化，需编译时定义）
         * @Note: 写入完成后自动重置写缓冲区，避免内存泄漏
         */
        ssize_t write(int* saveErrno);
    
        /*
         * @Function: Close
         * @Description: 优雅关闭连接：
         *   1. 标记为 isClose_ = true
         *   2. 从 epoll 中删除事件
         *   3. 延迟关闭 socket（等待数据发送完毕）
         * @Note: 需配合析构函数释放资源，避免 FD 泄漏
         */
        void Close();
    
        /*
         * @Function: GetFd
         * @Return: 当前连接的 socket 文件描述符
         * @Note: 供 Reactor 模块获取 FD 进行事件注册
         */
        int GetFd() const;
    
        /*
         * @Function: GetPort
         * @Return: 客户端端口号（用于日志记录）
         */
        int GetPort() const;
    
        /*
         * @Function: GetIP
         * @Return: 客户端 IP 地址（点分十进制字符串）
         * @Note: 内部通过 inet_ntop 转换，线程安全
         */
        const char* GetIP() const;
    
        /*
         * @Function: GetAddr
         * @Return: 客户端 sockaddr_in 结构体（供 SO_REUSEPORT 等高级特性使用）
         */
        sockaddr_in GetAddr() const;
    
        /*
         * @Function: process
         * @Return: true 表示处理完成，false 表示需要继续读取
         * @Description: HTTP 协议处理核心：
         *   1. 解析请求行、头部、正文（支持 chunked 编码）
         *   2. 生成响应（静态文件/动态 CGI/数据库查询）
         *   3. 处理 Keep-Alive 连接（自动续期定时器）
         * @Note: 需配合 HttpRequest/HttpResponse 完成协议解析与构造
         */
        bool process();
    
        /*
         * @Function: ToWriteBytes
         * @Return: 当前待发送的数据总长度（供负载均衡决策使用）
         * @Note: 用于优先级队列排序，优化写事件调度
         */
        int ToWriteBytes() { 
            return iov_[0].iov_len + iov_[1].iov_len; 
        }
    
        /*
         * @Function: IsKeepAlive
         * @Return: 是否保持长连接（根据 HTTP 请求头判断）
         * @Note: 超过超时时间（默认 60s）自动关闭
         */
        bool IsKeepAlive() const {
            return request_.IsKeepAlive();
        }
    
        /*
         * @StaticVariable: isET
         * @Description: 全局触发模式（ET/LT），需与 epoll 一致
         * @Note: 初始化时根据编译选项设置（-DUSE_ET）
         */
        static bool isET;
    
        /*
         * @StaticVariable: srcDir
         * @Description: 静态资源根目录（如 /var/www/html）
         * @Note: 需在程序启动时通过命令行参数设置
         */
        static const char* srcDir;
    
        /*
         * @StaticVariable: userCount
         * @Description: 全局活跃连接数（原子变量，线程安全）
         * @Note: 用于监控服务器负载，触发过载保护
         */
        static std::atomic<int> userCount;
    
    private:
        /*
         * @Variable: fd_
         * @Description: 连接的 socket 文件描述符（非阻塞）
         * @LifeCycle: 初始化时赋值，Close() 时关闭
         */
        int fd_;
    
        /*
         * @Variable: addr_
         * @Description: 客户端地址信息（缓存以便日志打印）
         */
        struct sockaddr_in addr_;
    
        /*
         * @Variable: isClose_
         * @Description: 连接关闭标记（避免重复关闭 FD）
         * @State: true - 已关闭（等待资源释放），false - 活跃
         */
        bool isClose_;
    
        /*
         * @Variable: iovCnt_
         * @Description: iovec 数组有效元素个数（用于分散写）
         * @Note: 0 - 无数据，1 - 仅有响应头，2 - 头+文件数据
         */
        int iovCnt_;
    
        /*
         * @Variable: iov_[2]
         * @Description: 分散写向量（第一元素为响应头，第二为文件数据）
         * @Optimization: 减少系统调用次数，提升大文件传输效率
         */
        struct iovec iov_[2];
    
        /*
         * @Variable: readBuff_
         * @Description: 读缓冲区（双指针结构，支持零拷贝解析）
         * @Size: 初始 64KB，动态扩容（最大 4MB）
         * @Note: 配合 Buffer::ReadFd() 实现高效网络收包
         */
        Buffer readBuff_;
    
        /*
         * @Variable: writeBuff_
         * @Description: 写缓冲区（预分配响应头空间，减少内存碎片）
         * @Optimization: 响应头与文件数据分离（通过 iovec 零拷贝发送）
         */
        Buffer writeBuff_;
    
        /*
         * @Variable: request_
         * @Description: HTTP 请求解析器（封装方法、路径、头部、正文）
         * @Note: 支持 HTTP/1.1 标准，自动处理百分号编码
         */
        HttpRequest request_;
    
        /*
         * @Variable: response_
         * @Description: HTTP 响应生成器（封装状态码、头部、Body）
         * @Feature: 支持 gzip 压缩、缓存控制、Range 请求
         */
        HttpResponse response_;
    };

#endif